{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5092d947",
   "metadata": {},
   "source": [
    "# Chapter 16 Pre-Trained LLMs and the LangChain Library\n",
    "\n",
    "This chapter covers\n",
    "* How to use pre-trained LLMs for text, image, speech, and code generation\n",
    "* Few-shot, one-shot, and zero-shot prompting in content generation\n",
    "* How to use LangChain to create a zero-shot know-it-all personal assistant\n",
    "* Limitations and ethical concerns of generative AI\n",
    "\n",
    "The The rise of pre-trained large language models (LLMs) has transformed the field of natural language processing (NLP) and generative tasks. OpenAI's GPT series, a notable example, showcases the extensive capabilities of these models in producing human-like text, images, speech, and even code. The effective utilization of these pre-trained LLMs is essential for several reasons. It enables us to deploy advanced AI functionalities without the need for vast resources to develop and train these models. Moreover, understanding these LLMs paves the way for innovative applications that leverage NLP and generative AI, fostering progress across various industries.\n",
    "\n",
    "In a world increasingly influenced by AI, mastering the integration and customization of pre-trained LLMs offers a crucial competitive advantage. As AI evolves, leveraging these sophisticated models becomes vital for innovation and success in the digital landscape.\n",
    "\n",
    "Typically, these models are operated through browser-based interfaces, which vary across different LLMs that function independently of each other. Each model has unique strengths and specialties. Interfacing through a browser limits our ability to fully leverage the potential of each specific LLM. Utilizing programming languages like Python, particularly through tools such as the LangChain library, provides substantial benefits for the following reasons.\n",
    "\n",
    "Python's role in interacting with LLMs enhances the automation of workflows and processes. Python scripts, capable of running autonomously, facilitate uninterrupted operations without the need for manual input. This is especially beneficial for businesses that regularly handle large amounts of data. For instance, a Python script could autonomously generate monthly reports by querying an LLM, synthesizing the data insights, and disseminating these findings via email or into a database. Python offers a greater level of customization and control in managing interactions with LLMs than browser-based interfaces do, enabling us to craft custom code to meet specific operational needs such as implementing conditional logic, processing multiple requests in loops, or managing exceptions. This adaptability is essential for customizing outputs to meet particular business objectives or research inquiries.\n",
    "\n",
    "Python's rich array of libraries makes it ideally suited for integrating LLMs with existing software and systems. A prime example of this is the LangChain library, which extends Python's functionality with LLMs. LangChain enables the combination of multiple LLMs or the integration of LLM capabilities with other services, such as the Wikipedia API or the Wolfram Alpha API, which will be covered later in this chapter. This capability of \"chaining\" different services allows for the construction of sophisticated, multi-step AI systems where tasks are segmented and handled by the best-suited models or services, enhancing both performance and accuracy.\n",
    "\n",
    "To that end, in this chapter, you’ll first learn how to use the OpenAI API to create various content by using Python programming: text, images, speech, and Python code. You’ll also learn the difference between few-shot, one-shot, and zero-shot content generation. Few-shot prompting means you give the model multiple examples to help it understand the task, while one-shot or zero-shot prompting means one example or no example is provided. \n",
    "\n",
    "Modern LLMs such as ChatGPT are trained on preexisting knowledge a few months ago so they cannot provide recent or real-time information such as weather conditions, flight status, or stock prices. You’ll learn to combine LLMs with Wolfram Alpha and Wikipeda APIs using the LangChain library to create a zero-shot know-it-all personal assistant. \n",
    "\n",
    "Despite LLMs’ impressive capabilities, they do not possess an intrinsic understanding of the content. This can lead to errors in logic, factual inaccuracies, and a failure to grasp complex concepts or nuances. The rapid advancement and widespread application of these models also lead to various ethical concerns such as bias, misinformation, privacy, and copyright. These issues demand careful consideration and proactive measures to ensure that the development and deployment of LLMs align with ethical standards and societal values. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "777e1839",
   "metadata": {},
   "source": [
    "# 1\tContent generation with the OpenAI API\n",
    "## 1.1\tText generation tasks with OpenAI API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c28bdbdd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: openai in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (1.14.1)\n",
      "Requirement already satisfied: langchain_openai in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (0.0.8)\n",
      "Requirement already satisfied: langchain in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (0.1.12)\n",
      "Requirement already satisfied: anyio<5,>=3.5.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from openai) (3.5.0)\n",
      "Requirement already satisfied: distro<2,>=1.7.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from openai) (1.9.0)\n",
      "Requirement already satisfied: httpx<1,>=0.23.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from openai) (0.27.0)\n",
      "Requirement already satisfied: pydantic<3,>=1.9.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from openai) (1.10.11)\n",
      "Requirement already satisfied: sniffio in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from openai) (1.2.0)\n",
      "Requirement already satisfied: tqdm>4 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from openai) (4.65.0)\n",
      "Requirement already satisfied: typing-extensions<5,>=4.7 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from openai) (4.7.1)\n",
      "Requirement already satisfied: langchain-core<0.2.0,>=0.1.27 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain_openai) (0.1.32)\n",
      "Requirement already satisfied: tiktoken<1,>=0.5.2 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain_openai) (0.6.0)\n",
      "Requirement already satisfied: PyYAML>=5.3 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (6.0)\n",
      "Requirement already satisfied: SQLAlchemy<3,>=1.4 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (1.4.49)\n",
      "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from langchain) (3.8.4)\n",
      "Requirement already satisfied: dataclasses-json<0.7,>=0.5.7 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from langchain) (0.5.9)\n",
      "Requirement already satisfied: jsonpatch<2.0,>=1.33 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (1.33)\n",
      "Requirement already satisfied: langchain-community<0.1,>=0.0.28 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (0.0.28)\n",
      "Requirement already satisfied: langchain-text-splitters<0.1,>=0.0.1 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (0.0.1)\n",
      "Requirement already satisfied: langsmith<0.2.0,>=0.1.17 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (0.1.26)\n",
      "Requirement already satisfied: numpy<2,>=1 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (1.23.5)\n",
      "Requirement already satisfied: requests<3,>=2 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (2.31.0)\n",
      "Requirement already satisfied: tenacity<9.0.0,>=8.1.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain) (8.2.2)\n",
      "Requirement already satisfied: attrs>=17.3.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (22.1.0)\n",
      "Requirement already satisfied: charset-normalizer<4.0,>=2.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (2.0.4)\n",
      "Requirement already satisfied: multidict<7.0,>=4.5 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (6.0.4)\n",
      "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (4.0.2)\n",
      "Requirement already satisfied: yarl<2.0,>=1.0 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.9.2)\n",
      "Requirement already satisfied: frozenlist>=1.1.1 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.3.3)\n",
      "Requirement already satisfied: aiosignal>=1.1.2 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.3.1)\n",
      "Requirement already satisfied: idna>=2.8 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from anyio<5,>=3.5.0->openai) (3.4)\n",
      "Requirement already satisfied: marshmallow<4.0.0,>=3.3.0 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain) (3.19.0)\n",
      "Requirement already satisfied: marshmallow-enum<2.0.0,>=1.5.1 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain) (1.5.1)\n",
      "Requirement already satisfied: typing-inspect>=0.4.0 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain) (0.9.0)\n",
      "Requirement already satisfied: certifi in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from httpx<1,>=0.23.0->openai) (2023.7.22)\n",
      "Requirement already satisfied: httpcore==1.* in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from httpx<1,>=0.23.0->openai) (1.0.4)\n",
      "Requirement already satisfied: h11<0.15,>=0.13 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.14.0)\n",
      "Requirement already satisfied: jsonpointer>=1.9 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from jsonpatch<2.0,>=1.33->langchain) (2.4)\n",
      "Requirement already satisfied: packaging<24.0,>=23.2 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain-core<0.2.0,>=0.1.27->langchain_openai) (23.2)\n",
      "Requirement already satisfied: orjson<4.0.0,>=3.9.14 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langsmith<0.2.0,>=0.1.17->langchain) (3.9.15)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from requests<3,>=2->langchain) (1.26.15)\n",
      "Requirement already satisfied: greenlet!=0.4.17 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from SQLAlchemy<3,>=1.4->langchain) (2.0.2)\n",
      "Requirement already satisfied: regex>=2022.1.18 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from tiktoken<1,>=0.5.2->langchain_openai) (2023.6.3)\n",
      "Requirement already satisfied: colorama in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from tqdm>4->openai) (0.4.6)\n",
      "Requirement already satisfied: mypy-extensions>=0.3.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from typing-inspect>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain) (0.4.3)\n",
      "Requirement already satisfied: wolframalpha in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (5.0.0)\n",
      "Collecting langchainhub\n",
      "  Downloading langchainhub-0.1.15-py3-none-any.whl.metadata (621 bytes)\n",
      "Requirement already satisfied: langchain_community in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (0.0.28)\n",
      "Requirement already satisfied: xmltodict in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from wolframalpha) (0.13.0)\n",
      "Requirement already satisfied: more-itertools in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from wolframalpha) (8.12.0)\n",
      "Requirement already satisfied: jaraco.context in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from wolframalpha) (4.3.0)\n",
      "Requirement already satisfied: requests<3,>=2 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchainhub) (2.31.0)\n",
      "Collecting types-requests<3.0.0.0,>=2.31.0.2 (from langchainhub)\n",
      "  Downloading types_requests-2.31.0.20240311-py3-none-any.whl.metadata (1.8 kB)\n",
      "Requirement already satisfied: PyYAML>=5.3 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain_community) (6.0)\n",
      "Requirement already satisfied: SQLAlchemy<3,>=1.4 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain_community) (1.4.49)\n",
      "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from langchain_community) (3.8.4)\n",
      "Requirement already satisfied: dataclasses-json<0.7,>=0.5.7 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from langchain_community) (0.5.9)\n",
      "Requirement already satisfied: langchain-core<0.2.0,>=0.1.31 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain_community) (0.1.32)\n",
      "Requirement already satisfied: langsmith<0.2.0,>=0.1.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain_community) (0.1.26)\n",
      "Requirement already satisfied: numpy<2,>=1 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain_community) (1.23.5)\n",
      "Requirement already satisfied: tenacity<9.0.0,>=8.1.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain_community) (8.2.2)\n",
      "Requirement already satisfied: attrs>=17.3.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (22.1.0)\n",
      "Requirement already satisfied: charset-normalizer<4.0,>=2.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (2.0.4)\n",
      "Requirement already satisfied: multidict<7.0,>=4.5 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (6.0.4)\n",
      "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (4.0.2)\n",
      "Requirement already satisfied: yarl<2.0,>=1.0 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.9.2)\n",
      "Requirement already satisfied: frozenlist>=1.1.1 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.3.3)\n",
      "Requirement already satisfied: aiosignal>=1.1.2 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.3.1)\n",
      "Requirement already satisfied: marshmallow<4.0.0,>=3.3.0 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain_community) (3.19.0)\n",
      "Requirement already satisfied: marshmallow-enum<2.0.0,>=1.5.1 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain_community) (1.5.1)\n",
      "Requirement already satisfied: typing-inspect>=0.4.0 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain_community) (0.9.0)\n",
      "Requirement already satisfied: anyio<5,>=3 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain-core<0.2.0,>=0.1.31->langchain_community) (3.5.0)\n",
      "Requirement already satisfied: jsonpatch<2.0,>=1.33 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain-core<0.2.0,>=0.1.31->langchain_community) (1.33)\n",
      "Requirement already satisfied: packaging<24.0,>=23.2 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain-core<0.2.0,>=0.1.31->langchain_community) (23.2)\n",
      "Requirement already satisfied: pydantic<3,>=1 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langchain-core<0.2.0,>=0.1.31->langchain_community) (1.10.11)\n",
      "Requirement already satisfied: orjson<4.0.0,>=3.9.14 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from langsmith<0.2.0,>=0.1.0->langchain_community) (3.9.15)\n",
      "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from requests<3,>=2->langchainhub) (3.4)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from requests<3,>=2->langchainhub) (1.26.15)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from requests<3,>=2->langchainhub) (2023.7.22)\n",
      "Requirement already satisfied: greenlet!=0.4.17 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from SQLAlchemy<3,>=1.4->langchain_community) (2.0.2)\n",
      "Collecting urllib3<3,>=1.21.1 (from requests<3,>=2->langchainhub)\n",
      "  Downloading urllib3-2.2.1-py3-none-any.whl.metadata (6.4 kB)\n",
      "Requirement already satisfied: sniffio>=1.1 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from anyio<5,>=3->langchain-core<0.2.0,>=0.1.31->langchain_community) (1.2.0)\n",
      "Requirement already satisfied: jsonpointer>=1.9 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from jsonpatch<2.0,>=1.33->langchain-core<0.2.0,>=0.1.31->langchain_community) (2.4)\n",
      "Requirement already satisfied: typing-extensions>=4.2.0 in c:\\users\\hlliu2\\appdata\\roaming\\python\\python311\\site-packages (from pydantic<3,>=1->langchain-core<0.2.0,>=0.1.31->langchain_community) (4.7.1)\n",
      "Requirement already satisfied: mypy-extensions>=0.3.0 in c:\\users\\hlliu2\\anaconda3\\envs\\gan\\lib\\site-packages (from typing-inspect>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain_community) (0.4.3)\n",
      "Downloading langchainhub-0.1.15-py3-none-any.whl (4.6 kB)\n",
      "Downloading types_requests-2.31.0.20240311-py3-none-any.whl (14 kB)\n",
      "Downloading urllib3-2.2.1-py3-none-any.whl (121 kB)\n",
      "   ---------------------------------------- 0.0/121.1 kB ? eta -:--:--\n",
      "   ---------------------------------------- 121.1/121.1 kB 6.9 MB/s eta 0:00:00\n",
      "Installing collected packages: urllib3, types-requests, langchainhub\n",
      "  Attempting uninstall: urllib3\n",
      "    Found existing installation: urllib3 1.26.15\n",
      "    Uninstalling urllib3-1.26.15:\n",
      "      Successfully uninstalled urllib3-1.26.15\n",
      "Successfully installed langchainhub-0.1.15 types-requests-2.31.0.20240311 urllib3-2.2.1\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
      "transformers 4.30.1 requires huggingface-hub<1.0,>=0.14.1, which is not installed.\n",
      "google-auth 2.18.0 requires urllib3<2.0, but you have urllib3 2.2.1 which is incompatible.\n",
      "elasticsearch 7.17.9 requires urllib3<2,>=1.21.1, but you have urllib3 2.2.1 which is incompatible.\n"
     ]
    }
   ],
   "source": [
    "!pip install --upgrade openai langchain_openai langchain\n",
    "!pip install wolframalpha langchainhub langchain_community\n",
    "!pip install --upgrade --quiet wikipedia"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3887e597",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The Nobel Prize in Economics in 2000 was awarded to James J. Heckman and Daniel L. McFadden for their work on microeconometrics and microeconomic theory.\n"
     ]
    }
   ],
   "source": [
    "# https://platform.openai.com/docs/models for a list of models\n",
    "from openai import OpenAI\n",
    "\n",
    "openai_api_key=\"put your actual OpenAI API key here, in quotes\"    \n",
    "client=OpenAI(api_key=openai_api_key)\n",
    "\n",
    "completion = client.chat.completions.create(\n",
    "  model=\"gpt-3.5-turbo\",\n",
    "  messages=[\n",
    "    {\"role\": \"system\", \"content\": \n",
    "     '''You are a helpful assistant, knowledgeable about recent facts.'''},\n",
    "    {\"role\": \"user\", \"content\": \n",
    "     '''Who won the Nobel Prize in Economics in 2000?'''}\n",
    "  ]\n",
    ")\n",
    "print(completion.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c27ac697",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Self-motivation is a key factor in achieving success and personal growth in various aspects of life. It serves as the driving force behind our actions, decisions, and goals, pushing us to overcome obstacles and challenges along the way.\n",
      "\n",
      "One of the primary benefits of self-motivation is that it helps individuals take initiative and control of their lives. Instead of waiting for external factors or circumstances to motivate them, self-motivated individuals are able to tap into their own internal drive and determination to pursue their dreams and aspirations.\n",
      "\n",
      "Self-motivation also plays a crucial role in fostering resilience and perseverance. When faced with setbacks or failures, individuals who are self-motivated are more likely to bounce back and continue working towards their goals. They are able to maintain a positive mindset and outlook, even in the face of adversity, which ultimately helps them stay focused and committed to their objectives.\n",
      "\n",
      "Furthermore, self-motivation leads to a sense of empowerment and achievement. When individuals set their own goals and work towards them with dedication and enthusiasm, they experience a great sense of satisfaction and fulfillment once they achieve their desired outcomes. This sense of accomplishment boosts self-confidence and self-esteem, creating a positive cycle of motivation and success.\n",
      "\n",
      "In the professional sphere, self-motivation is highly valued by employers as it demonstrates an individual's ability to work independently, show initiative, and take ownership of their responsibilities. Self-motivated employees are more likely to be productive, proactive, and innovative in their work, which can contribute to their professional growth and advancement.\n",
      "\n",
      "Overall, self-motivation is a powerful force that drives individuals to strive for excellence, overcome challenges, and achieve their full potential. By cultivating a strong sense of self-motivation, individuals can unlock limitless possibilities and create a life filled with purpose, passion, and success.\n"
     ]
    }
   ],
   "source": [
    "# essay writing\n",
    "completion = client.chat.completions.create(\n",
    "  model=\"gpt-3.5-turbo\",\n",
    "  messages=[\n",
    "    {\"role\": \"system\", \"content\": \n",
    "     '''You are a helpful assistant, capable of writing essays.'''},\n",
    "    {\"role\": \"user\", \"content\": \n",
    "     '''Write a short essay on the importance of self-motivation.'''}\n",
    "  ]\n",
    ")\n",
    "print(completion.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6e8a5889",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Why was the equal sign so humble? Because he knew he wasn't less than or greater than anyone else!\n"
     ]
    }
   ],
   "source": [
    "# tell jokes\n",
    "completion = client.chat.completions.create(\n",
    "  model=\"gpt-3.5-turbo\",\n",
    "  messages=[\n",
    "    {\"role\": \"system\", \"content\": \n",
    "     '''You are a helpful assistant, capable of telling jokes.'''},\n",
    "    {\"role\": \"user\", \"content\": \n",
    "     '''Tell me a math joke.'''}\n",
    "  ]\n",
    ")\n",
    "print(completion.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "8bcdb7ae",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sure! Why was the math book sad? Because it had too many problems.\n"
     ]
    }
   ],
   "source": [
    "# continue conversation\n",
    "completion = client.chat.completions.create(\n",
    "  model=\"gpt-3.5-turbo\",\n",
    "  messages=[\n",
    "    {\"role\": \"user\", \"content\": \n",
    "     '''Haha, that's funny! Tell me another one.'''} \n",
    "  ]\n",
    ")\n",
    "print(completion.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82da5300",
   "metadata": {},
   "source": [
    "## 1.2\tCode generation with OpenAI API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3df30514",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sure! Here's a simple Python program using the matplotlib library to plot a sine graph:\n",
      "\n",
      "```python\n",
      "import matplotlib.pyplot as plt\n",
      "import numpy as np\n",
      "\n",
      "# Generate x values from 0 to 2*pi\n",
      "x = np.linspace(0, 2*np.pi, 100)\n",
      "\n",
      "# Calculate y values using the sine function\n",
      "y = np.sin(x)\n",
      "\n",
      "# Plot the sine graph\n",
      "plt.figure()\n",
      "plt.plot(x, y)\n",
      "plt.title('Sine Graph')\n",
      "plt.xlabel('x')\n",
      "plt.ylabel('sin(x)')\n",
      "plt.grid(True)\n",
      "plt.show()\n",
      "```\n",
      "\n",
      "You can run this program in a Python environment with the matplotlib library installed to visualize the sine graph.\n"
     ]
    }
   ],
   "source": [
    "# generte code \n",
    "completion = client.chat.completions.create(\n",
    "  model=\"gpt-3.5-turbo\",\n",
    "  messages=[\n",
    "    {\"role\": \"system\", \"content\": \n",
    "     '''You are a helpful assistant, \n",
    "     capable of generating Python programs.'''},\n",
    "    {\"role\": \"user\", \"content\": \n",
    "     '''Write a Python program to plot a sine graph.'''}\n",
    "  ]\n",
    ")\n",
    "print(completion.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "8f0e688d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# Generate x values from 0 to 2*pi\n",
    "x = np.linspace(0, 2*np.pi, 100)\n",
    "\n",
    "# Calculate y values using the sine function\n",
    "y = np.sin(x)\n",
    "\n",
    "# Plot the sine graph\n",
    "plt.figure()\n",
    "plt.plot(x, y)\n",
    "plt.title('Sine Graph')\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('sin(x)')\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "897ae0a2",
   "metadata": {},
   "source": [
    "## 1.3\tImage Generation with OpenAI DALL-E 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d43ca2ed",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "https://oaidalleapiprodscus.blob.core.windows.net/private/org-P72SfulRZyJsmDfpfTH1vKpR/user-7GFl4ULuZhXf72tIrGMMJlUX/img-6tiHl1bq29txyw8GUE8jIP5d.png?st=2024-03-15T18%3A32%3A53Z&se=2024-03-15T20%3A32%3A53Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-03-15T06%3A35%3A29Z&ske=2024-03-16T06%3A35%3A29Z&sks=b&skv=2021-08-06&sig=3ZnwVqvxyl76ltcxQiCFCTc2Oos99wM3ERyXwSzRvIk%3D\n"
     ]
    }
   ],
   "source": [
    "# generte image\n",
    "response = client.images.generate(\n",
    "  model=\"dall-e-2\",\n",
    "  prompt=\"someone fishing at the river bank\",\n",
    "  size=\"512x512\",\n",
    "  quality=\"standard\",\n",
    "  n=1,\n",
    ")\n",
    "image_url = response.data[0].url\n",
    "print(image_url)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aca366dc",
   "metadata": {},
   "source": [
    "<img src=\"https://gattonweb.uky.edu/faculty/lium/gai/fishing.png\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8e237d6",
   "metadata": {},
   "source": [
    "## 1.4\tSpeech generation with OpenAI API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "f2901820",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\hlliu2\\AppData\\Local\\Temp\\ipykernel_19568\\3684615633.py:14: DeprecationWarning: Due to a bug, this method doesn't actually stream the response content, `.with_streaming_response.method()` should be used instead\n",
      "  response.stream_to_file(\"files/speech.mp3\")\n"
     ]
    }
   ],
   "source": [
    "response = client.audio.speech.create(\n",
    "  model=\"tts-1-hd\",\n",
    "  voice=\"shimmer\",\n",
    "  input='''This is an audio file generated by \n",
    "    OpenAI's text to speech AI model.'''\n",
    ")\n",
    "response.stream_to_file(\"files/speech.mp3\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c363b2da",
   "metadata": {},
   "outputs": [],
   "source": [
    "import IPython.display as ipd\n",
    "ipd.Audio(\"files/speech.mp3\") "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "655568a2",
   "metadata": {},
   "source": [
    "# 2. Introduction to LangChain\n",
    "## 2.1 The need for the LangChain library"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "28128333",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "I'm sorry, but I cannot provide real-time information or make predictions about future events such as the 2024 Academy Awards. For the most accurate and up-to-date information, I recommend checking reliable sources or news outlets closer to the date of the awards show.\n"
     ]
    }
   ],
   "source": [
    "completion = client.chat.completions.create(\n",
    "  model=\"gpt-4\",\n",
    "  messages=[\n",
    "    {\"role\": \"system\", \"content\": \n",
    "     '''You are a helpful assistant, knowledgeable about recent facts.'''},\n",
    "    {\"role\": \"user\", \"content\": \n",
    "     '''Who won the Best Actor Award in 2024 Academy Awards?'''}\n",
    "  ]\n",
    ")\n",
    "print(completion.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d48ab5c7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The result of the operation is 1,398.\n"
     ]
    }
   ],
   "source": [
    "completion = client.chat.completions.create(\n",
    "  model=\"gpt-4\",\n",
    "  messages=[\n",
    "    {\"role\": \"system\", \"content\": \n",
    "     '''You are a helpful assistant, good at math calculations.'''},\n",
    "    {\"role\": \"user\", \"content\": \n",
    "     '''how much is 23*55+123?'''}\n",
    "  ]\n",
    ")\n",
    "print(completion.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3bf2b714",
   "metadata": {},
   "source": [
    "## 2.2 Use OpenAI API in LangChain "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "37d9a5e9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I went to the store to buy a phone, but it was no good. I returned it and got a new phone.\n"
     ]
    }
   ],
   "source": [
    "from langchain_openai import OpenAI\n",
    "\n",
    "llm = OpenAI(openai_api_key=openai_api_key)\n",
    "\n",
    "prompt = \"\"\"\n",
    "Correct the grammar errors in the text:\n",
    "\n",
    "i had went to stor buy phone. No good. returned get new phone.\n",
    "\"\"\"\n",
    "\n",
    "res=llm.invoke(prompt)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "ed083d54",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "The capital city of Kentucky is Frankfort.\n"
     ]
    }
   ],
   "source": [
    "prompt = \"\"\"\n",
    "What is the capital city of the state of Kentucky?\n",
    "\"\"\"\n",
    "res=llm.invoke(prompt)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95c178d8",
   "metadata": {},
   "source": [
    "## 2.3 Zero-shot, one-shot, and few-shot prompting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "8086f28f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Negative\n"
     ]
    }
   ],
   "source": [
    "# few-shot prompting\n",
    "prompt = \"\"\"\n",
    "The movie is awesome! // Negative\n",
    "It is so bad! // Negative\n",
    "Wow, the movie was incredible! // Positive\n",
    "How horrible the movie is! //\n",
    "\"\"\"\n",
    "res=llm.invoke(prompt)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "52f9c974",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Pilot\n"
     ]
    }
   ],
   "source": [
    "# one-shot prompting\n",
    "prompt = \"\"\"\n",
    "Car -> Driver\n",
    "Plane ->\n",
    "\"\"\"\n",
    "res=llm.invoke(prompt)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "a35978a9",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Gardener\n"
     ]
    }
   ],
   "source": [
    "# exercise 16.1\n",
    "prompt = \"\"\"\n",
    "Kitchen -> Chef\n",
    "Garden ->\n",
    "\"\"\"\n",
    "res=llm.invoke(prompt)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "c8f7399f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "positive\n"
     ]
    }
   ],
   "source": [
    "# zero-shot prompting\n",
    "prompt = \"\"\"\n",
    "Is the tone in the sentence \"Today is a great day for me\" positive, \n",
    "negative, or neutral?\n",
    "\"\"\"\n",
    "res=llm.invoke(prompt)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32be157d",
   "metadata": {},
   "source": [
    "# 3\tA zero-shot know-it-all agent in LangChain\n",
    "## 3.1\tApply for a Wolfram Alpha API Key"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "8a8ab68e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assumption: 23×55 + 123 \n",
      "Answer: 1388\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "os.environ['WOLFRAM_ALPHA_APPID'] = \"your Wolfram Alpha AppID\" \n",
    "\n",
    "from langchain_community.utilities.wolfram_alpha import \\\n",
    "WolframAlphaAPIWrapper\n",
    "wolfram = WolframAlphaAPIWrapper()\n",
    "res=wolfram.run(\"how much is 23*55+123?\")\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "ed913d35",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Page: University of Kentucky\n",
      "Summary: The University of Kentucky (UK, UKY, or U of K) is a public land-grant research university in Lexington, Kentucky. Founded in 1865 by John Bryan Bowman as the Agricultural and Mechanical College of Kentucky, the university is one of the state's two land-grant universities (the other being Kentucky State University).  It is the institution with the highest enrollment in the state, with 32,710 students in the fall of 2022.The institution comprises 16 colleges, a graduate school, 93 undergraduate programs, 99 master programs, 66 doctoral programs, and 4 professional programs. It is classified among \"R1: Doctoral Universities – Very high research activity\". According to the National Science Foundation, Kentucky spent $476.5 million on research and development in 2022, ranking it 61st in the nation.The University of Kentucky has seven libraries on campus. The largest is the William T. Young Library, a federal depository that hosts subjects related to social sciences, humanities, and life sciences collections. Since 1997, the university has focused expenditures increasingly on research, following a compact formed by the Kentucky General Assembly. The directive mandated that the university become a \"Top 20\" public research institution, in terms of an overall ranking to be determined by the university itself, by 2020. Two alumni from the university have won Nobel Prizes.\n",
      "\n",
      "Page: Kentucky Wildcats men's basketball\n",
      "Summary: The Kentucky Wildcats men's basketball program is the men's college basketball team of the University of Kentucky. It has eight NCAA championships, the best all-time winning percentage, and the most all-time victories. The Wildcats compete in the Southeastern Conference and are currently coached by John Calipari.\n",
      "Adolph Rupp first brought Kentucky to national prominence, winning four NCAA titles. Since then, Joe B. Hall, Rick Pitino, Tubby Smith, and John Calipari each won a national championship, making Kentucky the only school with five coaches to win NCAA championships and placing it second only to UCLA for most titles. Kentucky has finished as the NCAA runner-up four times, making it tied with UCLA for all-time title game appearances at 12. The program has played in 17 NCAA Final Fours, tying Duke for third-all time behind North Carolina and UCLA. Kentucky leads all schools in several NCAA tournament stats: Elite Eight appearances at 38, Sweet Sixteen appearances at 45, total NCAA tournament appearances at 60, and tournament games played at 184. The program is tied in NCAA tournament wins with North Carolina at 131. Kentucky has also won the National Invitation Tournament twice, making it the only school to win multiple NCAA and NIT championships, and it leads all schools in total postseason appearances at 68. Additionally, the Helms Athletic Foundation declared Kentucky the 1933 and 1954 national champions, the latter being Kentucky's only undefeated team in the modern era (post-1930). The 1948 NCAA champion team, coached by Rupp, represented the United States in the Olympics and won a gold medal.\n",
      "Kentucky was the first program to 1000 wins in 1968 and the first to 2000 wins in 2009. The program leads all schools with sixty-three 20-win seasons, sixteen 30-win seasons, and six 35-win seasons. Additionally, Kentucky is second among all teams in conference regular season championships with 53.\n",
      "Throughout its history, the Kentucky basketball program has featured many notable and successful players, both on the collegiate level and the professional level. Five players have been named national player of the year, with Anthony Davis in 2012 and Oscar Tshiebwe in 2022 being consensus selections. Two players have been named national freshman of the year: John Wall in 2010 and Davis in 2012. Thirty-nine players have been selected as All-Americans a total of 51 times. Kentucky holds the record for the most overall NBA Draft selections (128) and three Wildcats have been selected as the \n"
     ]
    }
   ],
   "source": [
    "from langchain.tools import WikipediaQueryRun\n",
    "from langchain_community.utilities import WikipediaAPIWrapper\n",
    "wikipedia = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())\n",
    "res=wikipedia.run(\"University of Kentucky\")\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f23cd37",
   "metadata": {},
   "source": [
    "## 3.2\tCreate an agent in LangChain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "704f50a1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI should use Wolfram Alpha to find the current temperature in Lexington, Kentucky.\n",
      "Action: wolfram_alpha\n",
      "Action Input: temperature in Lexington, Kentucky\u001b[0m\u001b[36;1m\u001b[1;3mAssumption: temperature | Lexington, Kentucky \n",
      "Answer: 44 °F (wind chill: 41 °F)\n",
      "(27 minutes ago)\u001b[0m\u001b[32;1m\u001b[1;3mI now know the current temperature in Lexington, Kentucky.\n",
      "Final Answer: The temperature in Lexington, Kentucky is 44 °F with a wind chill of 41 °F.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "The temperature in Lexington, Kentucky is 44 °F with a wind chill of 41 °F.\n"
     ]
    }
   ],
   "source": [
    "os.environ['OPENAI_API_KEY'] = openai_api_key \n",
    "\n",
    "from langchain.agents import load_tools\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain import hub\n",
    "from langchain.agents import AgentExecutor, create_react_agent\n",
    "from langchain_openai import OpenAI\n",
    "\n",
    "prompt = hub.pull(\"hwchase17/react\")\n",
    "llm = ChatOpenAI(model_name='gpt-3.5-turbo')\n",
    "tool_names = [\"wolfram-alpha\"]\n",
    "tools = load_tools(tool_names,llm=llm)\n",
    "agent = create_react_agent(llm, tools, prompt)\n",
    "agent_executor = AgentExecutor(agent=agent, tools=tools,\n",
    "       handle_parsing_errors=True,verbose=True)\n",
    "\n",
    "res=agent_executor.invoke({\"input\": \"\"\"\n",
    "Wht is the temperature in Lexington, Kentucky now?\n",
    "\"\"\"})\n",
    "print(res[\"output\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "751245f8",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI need to find information about the winner of the Best Actor Award at the 2024 Academy Awards.\n",
      "Action: wikipedia\n",
      "Action Input: 2024 Academy Awards Best Actor\u001b[0m\u001b[33;1m\u001b[1;3mPage: Academy Award for Best Actor\n",
      "Summary: The Academy Award for Best Actor is an award presented annually by the Academy of Motion Picture Arts and Sciences (AMPAS). It has been awarded since the 1st Academy Awards to an actor who has delivered an outstanding performance in a leading role in a film released that year. The award is traditionally presented by the previous year's Best Actress winner.\n",
      "The Best Actor award has been presented 96 times, to 86 actors. The first winner was German actor Emil Jannings for his roles in The Last Command (1928) and The Way of All Flesh (1927). The most recent winner is Cillian Murphy for Oppenheimer (2023), who simultaneously became the first Irish actor to win this award. Italian actor Roberto Benigni gave the first winning non-English performance in Life Is Beautiful (1997) in this category. The record for most wins is three, held by Daniel Day-Lewis, while nine other actors have won twice. The record for most nominations is nine, jointly held by Spencer Tracy and Laurence Olivier. James Dean remains the only actor to have been posthumously nominated for this award more than once. At the 5th Academy Awards, Fredric March finished one vote ahead of Wallace Beery; under the rules of the time, this meant both actors were awarded, in this category's only tie.\n",
      "\n",
      "Page: Academy Award for Best Supporting Actor\n",
      "Summary: The Academy Award for Best Supporting Actor is an award presented annually by the Academy of Motion Picture Arts and Sciences (AMPAS). It has been awarded since the 9th Academy Awards to an actor who has delivered an outstanding performance in a supporting role in a film released that year. The award is traditionally presented by the previous year's Best Supporting Actress winner. In lieu of the traditional Oscar statuette, supporting acting recipients were given plaques up until the 16th Academy Awards, when statuettes were awarded to each category instead.The Best Supporting Actor award has been presented a total of 88 times, to 79 actors. The first winner was Walter Brennan for his role in Come and Get It. The most recent winner is Robert Downey Jr. for Oppenheimer. The record for most wins is three, held by Brennan–who won every other year within a succession of the first five years. Seven other actors have won twice. Brennan is also tied for receiving the most nominations in the category (with four altogether) along with Jeff Bridges, Robert Duvall, Arthur Kennedy, Jack Nicholson, Al Pacino, Claude Rains, and Mark Ruffalo.\n",
      "\n",
      "Page: Academy Award for Best Picture\n",
      "Summary: The Academy Award for Best Picture is one of the Academy Awards (also known as Oscars) presented annually by the Academy of Motion Picture Arts and Sciences (AMPAS) since the awards debuted in 1929. This award goes to the producers of the film and is the only category in which every member of the Academy is eligible to submit a nomination and vote on the final ballot. The Best Picture category is traditionally the final award of the night and is widely considered as the most prestigious honor of the ceremony.The Grand Staircase columns at the Dolby Theatre in Hollywood, where the Academy Awards ceremonies have been held since 2002, showcase every film that has won the Best Picture title since the award's inception. There have been 601 films nominated for Best Picture and 96 winners.\n",
      "\n",
      "\u001b[0m\u001b[32;1m\u001b[1;3mI need to specifically find out who won the Best Actor Award at the 2024 Academy Awards.\n",
      "Action: wikipedia\n",
      "Action Input: 2024 Academy Awards\u001b[0m\u001b[33;1m\u001b[1;3mPage: 96th Academy Awards\n",
      "Summary: The 96th Academy Awards ceremony, which was presented by the Academy of Motion Picture Arts and Sciences (AMPAS), took place on March 10, 2024, at the Dolby Theatre in Hollywood, Los Angeles. During the gala, the AMPAS presented Academy Awards (commonly referred to as Oscars) in 23 categories honoring films released in 2023. Comedian Jimmy Kimmel hosted the show for the fourth time.The nominations were announced on January 23, 2024. Oppenheimer led with 13 nominations, followed by Poor Things and Killers of the Flower Moon with 11 and 10, respectively. Oppenheimer won a leading seven awards, including Best Picture and Best Director. Other major winners were Poor Things with four awards and The Zone of Interest with two. The films which went home with one award each include American Fiction, Anatomy of a Fall, Barbie, The Boy and the Heron, Godzilla Minus One, The Holdovers, and 20 Days in Mariupol. The telecast drew 19.5 million viewers in the United States, becoming the most watched awards show since 2020.In related events, the Academy held its 14th annual Governors Awards ceremony, hosted by John Mulaney, at the Ray Dolby Ballroom at Ovation Hollywood on January 9, 2024. The Academy Scientific and Technical Awards were presented by host Natasha Lyonne on February 23, 2024, at the Academy Museum of Motion Pictures in Los Angeles. An American Sign Language livestream was broadcast on the Academy's YouTube page featuring video of interpreters.\n",
      "\n",
      "Page: List of Academy Award records\n",
      "Summary: This list of Academy Award records is current as of the 96th Academy Awards, with the ceremony taking place on March 10, 2024.\n",
      "\n",
      "Page: Academy Awards\n",
      "Summary: The Academy Awards, commonly known as the Oscars, are awards for artistic and technical merit for the film industry. They are presented annually by the Academy of Motion Picture Arts and Sciences (AMPAS) in the United States, in recognition of excellence in cinematic achievements as assessed by the Academy's voting membership. The Oscars are widely considered to be the most prestigious awards in the film industry.The major award categories are presented during a live televised Hollywood ceremony that is typically held in February or March. It is the oldest worldwide entertainment awards ceremony. The 1st Academy Awards were held in 1929, the second ceremony in 1930 was the first one broadcast by radio, and the 1953 ceremony was the first one televised. It is also the oldest of the four major annual American entertainment awards; its equivalents – the Emmy Awards for television, the Tony Awards for theater, and the Grammy Awards for music – are modeled after the Academy Awards. The Oscar statuette depicts a knight rendered in the Art Deco style.\u001b[0m\u001b[32;1m\u001b[1;3mI need to search for the specific winner of the Best Actor Award at the 2024 Academy Awards.\n",
      "Action: wikipedia\n",
      "Action Input: 96th Academy Awards Best Actor\u001b[0m\u001b[33;1m\u001b[1;3mPage: Academy Award for Best Actor\n",
      "Summary: The Academy Award for Best Actor is an award presented annually by the Academy of Motion Picture Arts and Sciences (AMPAS). It has been awarded since the 1st Academy Awards to an actor who has delivered an outstanding performance in a leading role in a film released that year. The award is traditionally presented by the previous year's Best Actress winner.\n",
      "The Best Actor award has been presented 96 times, to 86 actors. The first winner was German actor Emil Jannings for his roles in The Last Command (1928) and The Way of All Flesh (1927). The most recent winner is Cillian Murphy for Oppenheimer (2023), who simultaneously became the first Irish actor to win this award. Italian actor Roberto Benigni gave the first winning non-English performance in Life Is Beautiful (1997) in this category. The record for most wins is three, held by Daniel Day-Lewis, while nine other actors have won twice. The record for most nominations is nine, jointly held by Spencer Tracy and Laurence Olivier. James Dean remains the only actor to have been posthumously nominated for this award more than once. At the 5th Academy Awards, Fredric March finished one vote ahead of Wallace Beery; under the rules of the time, this meant both actors were awarded, in this category's only tie.\n",
      "\n",
      "Page: 96th Academy Awards\n",
      "Summary: The 96th Academy Awards ceremony, which was presented by the Academy of Motion Picture Arts and Sciences (AMPAS), took place on March 10, 2024, at the Dolby Theatre in Hollywood, Los Angeles. During the gala, the AMPAS presented Academy Awards (commonly referred to as Oscars) in 23 categories honoring films released in 2023. Comedian Jimmy Kimmel hosted the show for the fourth time.The nominations were announced on January 23, 2024. Oppenheimer led with 13 nominations, followed by Poor Things and Killers of the Flower Moon with 11 and 10, respectively. Oppenheimer won a leading seven awards, including Best Picture and Best Director. Other major winners were Poor Things with four awards and The Zone of Interest with two. The films which went home with one award each include American Fiction, Anatomy of a Fall, Barbie, The Boy and the Heron, Godzilla Minus One, The Holdovers, and 20 Days in Mariupol. The telecast drew 19.5 million viewers in the United States, becoming the most watched awards show since 2020.In related events, the Academy held its 14th annual Governors Awards ceremony, hosted by John Mulaney, at the Ray Dolby Ballroom at Ovation Hollywood on January 9, 2024. The Academy Scientific and Technical Awards were presented by host Natasha Lyonne on February 23, 2024, at the Academy Museum of Motion Pictures in Los Angeles. An American Sign Language livestream was broadcast on the Academy's YouTube page featuring video of interpreters.\n",
      "\n",
      "Page: Academy Award for Best Supporting Actor\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Summary: The Academy Award for Best Supporting Actor is an award presented annually by the Academy of Motion Picture Arts and Sciences (AMPAS). It has been awarded since the 9th Academy Awards to an actor who has delivered an outstanding performance in a supporting role in a film released that year. The award is traditionally presented by the previous year's Best Supporting Actress winner. In lieu of the traditional Oscar statuette, supporting acting recipients were given plaques up until the 16th Academy Awards, when statuettes were awarded to each category instead.The Best Supporting Actor award has been presented a total of 88 times, to 79 actors. The first winner was Walter Brennan for his role in Come and Get It. The most recent winner is Robert Downey Jr. for Oppenheimer. The record for most wins is three, held by Brennan–who won every other year within a succession of the first five years. Seven other actors have won twice. Brennan is also tied for receiving the most nominations in the category (with four altogether) along with Jeff Bridges, Robert Duvall, Arthur Kennedy, Jack Nicholson, Al Pacino, Claude Rai\u001b[0m\u001b[32;1m\u001b[1;3mI need to search specifically for the winner of the Best Actor Award at the 2024 Academy Awards.\n",
      "Action: wikipedia\n",
      "Action Input: 96th Academy Awards Best Actor winner\u001b[0m\u001b[33;1m\u001b[1;3mPage: 96th Academy Awards\n",
      "Summary: The 96th Academy Awards ceremony, which was presented by the Academy of Motion Picture Arts and Sciences (AMPAS), took place on March 10, 2024, at the Dolby Theatre in Hollywood, Los Angeles. During the gala, the AMPAS presented Academy Awards (commonly referred to as Oscars) in 23 categories honoring films released in 2023. Comedian Jimmy Kimmel hosted the show for the fourth time.The nominations were announced on January 23, 2024. Oppenheimer led with 13 nominations, followed by Poor Things and Killers of the Flower Moon with 11 and 10, respectively. Oppenheimer won a leading seven awards, including Best Picture and Best Director. Other major winners were Poor Things with four awards and The Zone of Interest with two. The films which went home with one award each include American Fiction, Anatomy of a Fall, Barbie, The Boy and the Heron, Godzilla Minus One, The Holdovers, and 20 Days in Mariupol. The telecast drew 19.5 million viewers in the United States, becoming the most watched awards show since 2020.In related events, the Academy held its 14th annual Governors Awards ceremony, hosted by John Mulaney, at the Ray Dolby Ballroom at Ovation Hollywood on January 9, 2024. The Academy Scientific and Technical Awards were presented by host Natasha Lyonne on February 23, 2024, at the Academy Museum of Motion Pictures in Los Angeles. An American Sign Language livestream was broadcast on the Academy's YouTube page featuring video of interpreters.\n",
      "\n",
      "Page: Academy Award for Best Actor\n",
      "Summary: The Academy Award for Best Actor is an award presented annually by the Academy of Motion Picture Arts and Sciences (AMPAS). It has been awarded since the 1st Academy Awards to an actor who has delivered an outstanding performance in a leading role in a film released that year. The award is traditionally presented by the previous year's Best Actress winner.\n",
      "The Best Actor award has been presented 96 times, to 86 actors. The first winner was German actor Emil Jannings for his roles in The Last Command (1928) and The Way of All Flesh (1927). The most recent winner is Cillian Murphy for Oppenheimer (2023), who simultaneously became the first Irish actor to win this award. Italian actor Roberto Benigni gave the first winning non-English performance in Life Is Beautiful (1997) in this category. The record for most wins is three, held by Daniel Day-Lewis, while nine other actors have won twice. The record for most nominations is nine, jointly held by Spencer Tracy and Laurence Olivier. James Dean remains the only actor to have been posthumously nominated for this award more than once. At the 5th Academy Awards, Fredric March finished one vote ahead of Wallace Beery; under the rules of the time, this meant both actors were awarded, in this category's only tie.\n",
      "\n",
      "Page: Academy Award for Best Picture\n",
      "Summary: The Academy Award for Best Picture is one of the Academy Awards (also known as Oscars) presented annually by the Academy of Motion Picture Arts and Sciences (AMPAS) since the awards debuted in 1929. This award goes to the producers of the film and is the only category in which every member of the Academy is eligible to submit a nomination and vote on the final ballot. The Best Picture category is traditionally the final award of the night and is widely considered as the most prestigious honor of the ceremony.The Grand Staircase columns at the Dolby Theatre in Hollywood, where the Academy Awards ceremonies have been held since 2002, showcase every film that has won the Best Picture title since the award's inception. There have been 601 films nominated for Best Picture and 96 winners.\n",
      "\n",
      "\u001b[0m\u001b[32;1m\u001b[1;3mI now know the final answer\n",
      "Final Answer: Cillian Murphy won the Best Actor Award at the 2024 Academy Awards for his performance in Oppenheimer.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "Cillian Murphy won the Best Actor Award at the 2024 Academy Awards for his performance in Oppenheimer.\n"
     ]
    }
   ],
   "source": [
    "tool_names += [\"wikipedia\"]\n",
    "tools = load_tools(tool_names,llm=llm)\n",
    "agent = create_react_agent(llm, tools, prompt)\n",
    "agent_executor = AgentExecutor(agent=agent, tools=tools,\n",
    "       handle_parsing_errors=True,verbose=True)\n",
    "\n",
    "res=agent_executor.invoke({\"input\": \"\"\"\n",
    "Who won the Best Actor Award in 2024 Academy Awards?\n",
    "\"\"\"})\n",
    "print(res[\"output\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7dafefc2",
   "metadata": {},
   "source": [
    "## 3.3\tAdd tools by using OpenAI GPTs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "535073f8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI should use the Text Summarizer tool to create a one-sentence summary of the text.\n",
      "Action: Text Summarizer\n",
      "Action Input: The University of Kentucky's Master of Science in Finance (MSF) degree prepares students for a professional career in the finance and banking industries. The program is designed to provide rigorous and focused training in finance, broaden opportunities in your career, and sharpened skills for the fast-changing and competitive world of modern finance.\u001b[0m\u001b[38;5;200m\u001b[1;3mThe University of Kentucky's MSF program offers specialized training in finance to prepare students for successful careers in the finance and banking industries.\u001b[0m\u001b[32;1m\u001b[1;3mI now know the final answer.\n",
      "Final Answer: The University of Kentucky's MSF program offers specialized training in finance to prepare students for successful careers in the finance and banking industries.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "The University of Kentucky's MSF program offers specialized training in finance to prepare students for successful careers in the finance and banking industries.\n"
     ]
    }
   ],
   "source": [
    "from langchain.agents import Tool\n",
    "from langchain.prompts import PromptTemplate\n",
    "from langchain.chains import LLMChain\n",
    "\n",
    "temp = PromptTemplate(input_variables=[\"text\"],\n",
    "template=\"Write a one sentence summary of the following text: {text}\")\n",
    "\n",
    "summarizer = LLMChain(llm=llm, prompt=temp)\n",
    "\n",
    "sum_tool = Tool.from_function(\n",
    "    func=summarizer.run,\n",
    "    name=\"Text Summarizer\",\n",
    "    description=\"A tool for summarizing texts\")\n",
    "tools+=[sum_tool]\n",
    "agent = create_react_agent(llm, tools, prompt)\n",
    "agent_executor = AgentExecutor(agent=agent, tools=tools,\n",
    "       handle_parsing_errors=True,verbose=True)\n",
    "res=agent_executor.invoke({\"input\": \n",
    "'''Write a one sentence summary of the following text:\n",
    "The University of Kentucky's Master of Science\n",
    " in Finance (MSF) degree prepares students for\n",
    " a professional career in the finance and banking\n",
    " industries. The program is designed to provide\n",
    " rigorous and focused training in finance, \n",
    " broaden opportunities in your career, and \n",
    " sharpened skills for the fast-changing \n",
    " and competitive world of modern finance.'''})\n",
    "print(res[\"output\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "d8fb693c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI should use the Joke Teller tool to find a coding-related joke.\n",
      "Action: Joke Teller\n",
      "Action Input: coding\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mWhy was the JavaScript developer sad?\n",
      "\n",
      "Because he didn't know how to \"null\" his feelings.\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mThat joke was funny!\n",
      "Final Answer: Why was the JavaScript developer sad? Because he didn't know how to \"null\" his feelings.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "Why was the JavaScript developer sad? Because he didn't know how to \"null\" his feelings.\n"
     ]
    }
   ],
   "source": [
    "temp = PromptTemplate(input_variables=[\"text\"],\n",
    "template=\"Tell a joke on the following subject: {subject}\")\n",
    "\n",
    "joke_teller = LLMChain(llm=llm, prompt=temp)\n",
    "\n",
    "tools+=[Tool.from_function(name='Joke Teller',\n",
    "       func=joke_teller.run,\n",
    "       description='A tool for telling jokes')]\n",
    "agent = create_react_agent(llm, tools, prompt)\n",
    "agent_executor = AgentExecutor(agent=agent, tools=tools,\n",
    "       handle_parsing_errors=True,verbose=True)\n",
    "\n",
    "res=agent_executor.invoke({\"input\": \n",
    "'''Tell a joke on the following subject: coding'''})\n",
    "print(res[\"output\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "4abc1a03",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI should use the Sentiment Classifier to determine the sentiment of the text.\n",
      "Action: Sentiment Classifier\n",
      "Action Input: \"this movie is so-so\"\u001b[0m\n",
      "Observation: \u001b[33;1m\u001b[1;3mNeutral\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mThe sentiment of the text is neutral.\n",
      "Final Answer: Neutral\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "Neutral\n"
     ]
    }
   ],
   "source": [
    "# exercise 16.2\n",
    "temp = PromptTemplate(input_variables=[\"text\"],\n",
    "template='''Classify the following text as positive,\n",
    "    negative, or neutral: {text}''')\n",
    "\n",
    "classifier = LLMChain(llm=llm, prompt=temp)\n",
    "\n",
    "tools+=[Tool.from_function(name='Sentiment Classifier',\n",
    "       func=classifier.run,\n",
    "       description='A tool to classify sentiment')]\n",
    "agent = create_react_agent(llm, tools, prompt)\n",
    "agent_executor = AgentExecutor(agent=agent, tools=tools,\n",
    "       handle_parsing_errors=True,verbose=True)\n",
    "\n",
    "res=agent_executor.invoke({\"input\": \n",
    "'''Classify the following text as positive,\n",
    "    negative, or neutral: this movie is so-so.'''})\n",
    "print(res[\"output\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e9f9f3ad",
   "metadata": {},
   "source": [
    "## 3.4\tAdd tools to generate code and images"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "d2c2a51e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI should use the Code Generator tool to generate the Python program based on the given description.\n",
      "Action: Code Generator\n",
      "Action Input: Write a Python program to plot a sine curve and a cosine curve in the same graph. The sine curve is in solid line and the cosine curve is in dashed line. Add a legend to the graph. Set the x-axis range to -5 to 5. The title should be \"Comparing sine and cosine curves.\"\u001b[0m\n",
      "Observation: \u001b[33;1m\u001b[1;3mimport matplotlib.pyplot as plt\n",
      "import numpy as np\n",
      "\n",
      "x = np.linspace(-5, 5, 100)\n",
      "y1 = np.sin(x)\n",
      "y2 = np.cos(x)\n",
      "\n",
      "plt.plot(x, y1, label='Sine Curve', linestyle='solid')\n",
      "plt.plot(x, y2, label='Cosine Curve', linestyle='dashed')\n",
      "plt.legend()\n",
      "plt.title('Comparing Sine and Cosine Curves')\n",
      "plt.xlim(-5, 5)\n",
      "plt.show()\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mThe Python program has been successfully generated to plot the sine and cosine curves. I now know the final answer.\n",
      "\n",
      "Final Answer: The Python program to plot a sine curve and a cosine curve in the same graph with the specified requirements has been generated.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "The Python program to plot a sine curve and a cosine curve in the same graph with the specified requirements has been generated.\n"
     ]
    }
   ],
   "source": [
    "temp = PromptTemplate(input_variables=[\"text\"],\n",
    "template='''Write a Python program based on the \n",
    "    description in the following text: {text}''')\n",
    "\n",
    "code_generator = LLMChain(llm=llm, prompt=temp)\n",
    "\n",
    "tools+=[Tool.from_function(name='Code Generator',\n",
    "       func=code_generator.run,\n",
    "       description='A tool to generate code')]\n",
    "agent = create_react_agent(llm, tools, prompt)\n",
    "agent_executor = AgentExecutor(agent=agent, tools=tools,\n",
    "       handle_parsing_errors=True,verbose=True)\n",
    "\n",
    "res=agent_executor.invoke({\"input\": \n",
    "'''Write a Python program based on the \n",
    "    description in the following text: \n",
    "write a python program to plot a sine curve and a cosine curve\n",
    "in the same graph. The sine curve is in solid line and the cosine\n",
    "suve is in dashed line. Add a legend to the graph. Set the x-axis \n",
    "range to -5 to 5. The title should be \"Comparing sine and cosine curves.\"\n",
    "'''})\n",
    "print(res[\"output\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "eefca523",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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FxcXVqxY0aA+zNy5c1s0lqYYfycZGRkNeiSOHj16ReeNjIzE19eXrKysKw3R1Avm6OhIYmKixY9v6d9xQEAArq6upKenX3Tf4cOHm318586d6dKlC4sXL+Z///tfgy/QxoSHh7Nv3z4MBkODXpy0tDTT/UZOTk7ceOON3HjjjRgMBh599FE+++wzXnzxRYt65RoTFRXF3r17GTlypMXVmi19zcZevKKioga3/72XtTnu7u7ccMMN/Pzzz7z//vssWLCAIUOGEBoaajomKioKSZKIiIho8LfalO7du9O9e3deeOEFNm/ezKBBg5g9ezavv/66RbEJtkUMUQk259lnn8Xd3Z0HH3yQnJyci+4/duwY//vf/wC4/vrrAfjggw8aHGNskY4ZM6bF4/v4449N1yVJ4uOPP8bR0ZGRI0cCcstZo9E0aJlmZmayaNGiFo+lMcYekU8++aTB7R999JFZj9+2bRvl5eUX3b59+3YKCgrMGrJpTmBgIMOGDeOzzz5rNGHKy8u75ONb+nes0+lISkpi0aJFnDx50nR7amoqK1asMOscr7zyCgUFBTz44IPU1dVddP/KlStZsmQJIL9vs7OzWbBggen+uro6PvroIzw8PBg6dCgABQUFDc6h1Wrp0aMHANXV1Za9yEbccccdnDlzhi+++OKi+yorKxt9H1zIktdsnAO1fv160/16vf6yCnaOHz+es2fP8uWXX7J3794Gw1MAt956KzqdrtECjZIkmX6vJSUlF8XdvXt3tFpti/x+BWWJHhzB5kRFRfH9998zfvx44uLiGlQy3rx5Mz///DOTJk0CoGfPntx33318/vnnFBUVMXToULZv387XX3/N2LFjGT58eIvG5uLiwvLly7nvvvvo378/y5YtY+nSpTz//PMEBAQAclL1/vvvM2rUKO6++25yc3OZNWsW0dHR7Nu3r0XjaUxCQgK33XYbH3zwAQUFBQwYMIB169aZepqaa6l/++23zJ8/n1tuuYWEhAScnJxITU1lzpw5uLi48Pzzz7dInLNmzWLw4MF0796dKVOmEBkZSU5ODlu2bOH06dPs3bu3ycda43f8yiuvsHz5coYMGcKjjz5qSji6du1q1jnHjx/P/v37eeONN9izZ0+Dqr7Lly8nOTnZNHz20EMP8dlnnzFp0iR27dpFp06d+OWXX9i0aRMffPCBaeLugw8+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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "x = np.linspace(-5, 5, 100)\n",
    "y1 = np.sin(x)\n",
    "y2 = np.cos(x)\n",
    "\n",
    "plt.plot(x, y1, label='Sine Curve', linestyle='solid')\n",
    "plt.plot(x, y2, label='Cosine Curve', linestyle='dashed')\n",
    "plt.legend()\n",
    "plt.title('Comparing Sine and Cosine Curves')\n",
    "plt.xlim(-5, 5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "98622e3d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI should use the Text to image tool for this task.\n",
      "Action: Text to image\n",
      "Action Input: \"a horse grazes on the grassland.\"\u001b[0m\n",
      "Observation: \u001b[38;5;200m\u001b[1;3mThe image shows a beautiful horse standing in a lush green grassland, peacefully grazing on the fresh grass. The sun is shining down on the horse, casting a warm glow on its shiny coat. In the background, rolling hills and a clear blue sky can be seen, adding to the serene and peaceful atmosphere of the scene. The horse looks content and at ease in its natural habitat, symbolizing freedom and tranquility.\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mThe image created perfectly represents the text provided.\n",
      "Final Answer: The image depicts a horse grazing on the grassland.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "https://oaidalleapiprodscus.blob.core.windows.net/private/org-P72SfulRZyJsmDfpfTH1vKpR/user-7GFl4ULuZhXf72tIrGMMJlUX/img-MpGdHwtE46ougKLi2Ac6vMwR.png?st=2024-03-17T09%3A36%3A48Z&se=2024-03-17T11%3A36%3A48Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-03-17T06%3A30%3A03Z&ske=2024-03-18T06%3A30%3A03Z&sks=b&skv=2021-08-06&sig=UsJ7c7GkZebgXOGpWpkB3qBOFehcizSS82KLuxsLhKQ%3D\n"
     ]
    }
   ],
   "source": [
    "from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper\n",
    "temp = PromptTemplate(input_variables=[\"text\"],\n",
    "template=\"Create an image base on the following text: {text}\")\n",
    "\n",
    "grapher = LLMChain(llm=llm, prompt=temp)\n",
    "\n",
    "tools+=[Tool.from_function(name='Text to image',\n",
    "       func=grapher.run,\n",
    "       description='A tool for text to image')]\n",
    "agent = create_react_agent(llm, tools, prompt)\n",
    "agent_executor = AgentExecutor(agent=agent, tools=tools,\n",
    "       handle_parsing_errors=True,verbose=True)\n",
    "image_url = DallEAPIWrapper().run(agent_executor.invoke({\"input\": \n",
    "'''Create an image base on the following text: \n",
    "    a horse grazes on the grassland.'''})[\"output\"])\n",
    "print(image_url)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3013fca",
   "metadata": {},
   "source": [
    "<img src=\"https://gattonweb.uky.edu/faculty/lium/gai/grass.png\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b35e8b71",
   "metadata": {},
   "source": [
    "# 4\tLimitations and ethical concerns of LLMs"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
